package start;

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Thread03 {

    public static void main(String[] args) {
        // 创建线程池
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(200); // 有界队列
        executor.setThreadNamePrefix("oos-TaskExecutor-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 自我保护
        executor.initialize();


        // 用于保存所有 CompletableFuture，以便后续等待
        List<CompletableFuture<Void>> futures = new ArrayList<>();

        // 提交 500 个异步任务
        for (int i = 0; i < 30; i++) {

            // ✅ 关键：创建循环变量的局部副本，避免闭包陷阱
            int taskId = i;

            // 创建异步任务
            CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
                System.out.println(Thread.currentThread().getName() + " 开始执行任务 " + taskId);

                // 模拟处理阶段 2
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //System.out.println(Thread.currentThread().getName() + " 任务 " + taskId + " 处理成功");
            }, executor);


            // ✅ 处理任务提交本身的异常（如线程池拒绝）
            // 注意：whenComplete 通常也会被调用，所以这里一般不重复 release
            future.exceptionally(throwable -> {
                System.err.println("任务 " + taskId + " 提交或执行失败: " + throwable.getMessage());
                // 注意：whenComplete 会处理 release，这里不再 release
                return null;
            });

            // 保存 future 以便后续 join 等待
            futures.add( future);
        }

        System.out.println("所有任务已提交完毕（受信号量控制）。");

        try {
            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
            System.out.println("🎉 所有 500 个异步任务均已成功执行完毕！");
        } catch (Exception e) {
            System.err.println("等待任务完成时发生异常: " + e.getMessage());
            e.printStackTrace();
        }
    }
}